﻿using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Collections;

namespace Com.GainWinSoft.Common
{
    public class DataTableUtils
    {
                public static DataTable ToDataTable(IList list)

        {

            DataTable result = new DataTable();

            if (list.Count > 0)

            
            {

                PropertyInfo[] propertys = list[0].GetType().GetProperties();

                foreach (PropertyInfo pi in propertys)

                {

                    result.Columns.Add(pi.Name, pi.PropertyType);

                }

                for (int i = 0; i < list.Count; i++)

                {

                    ArrayList tempList = new ArrayList();

                    foreach (PropertyInfo pi in propertys)

                    {

                        object obj = pi.GetValue(list[i], null);

                        tempList.Add(obj);

                    }

                    object[] array = tempList.ToArray();

                    result.LoadDataRow(array, true);

                }

            }

            return result;

        }

        /// <summary>

        /// 将泛型集合类转换成DataTable

        /// </summary>

        /// <typeparam name="T">集合项类型</typeparam>

        /// <param name="list">集合</param>

        /// <returns>数据集(表)</returns>

        public static DataTable ToDataTable<T>(IList<T> list)

        {

            return  DataTableUtils.ToDataTable<T>(list, null);

        }

        /// <summary>

        /// 将泛型集合类转换成DataTable

        /// </summary>

        /// <typeparam name="T">集合项类型</typeparam>

        /// <param name="list">集合</param>

        /// <param name="propertyName">需要返回的列的列名</param>

        /// <returns>数据集(表)</returns>

        public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)

        {

            List<string> propertyNameList = new List<string>();

            if (propertyName != null)

                propertyNameList.AddRange(propertyName);

            DataTable result = new DataTable();

            if (list.Count > 0)

            {

                PropertyInfo[] propertys = list[0].GetType().GetProperties();

                foreach (PropertyInfo pi in propertys)

                {

                    if (propertyNameList.Count == 0)

                    {

                        result.Columns.Add(pi.Name, pi.PropertyType);

                    }

                    else 

                    {

                        if (propertyNameList.Contains(pi.Name))

                            result.Columns.Add(pi.Name, pi.PropertyType);

                    }

                }

                for (int i = 0; i < list.Count; i++)

                {

                    ArrayList tempList = new ArrayList();

                    foreach (PropertyInfo pi in propertys)

                    {

                        if (propertyNameList.Count == 0)

                        {

                            object obj = pi.GetValue(list[i], null);

                            tempList.Add(obj);

                        }

                        else

                        {

                            if (propertyNameList.Contains(pi.Name))

                            {

                                object obj = pi.GetValue(list[i], null);

                                tempList.Add(obj);

                            }

                        }

                    }

                    object[] array = tempList.ToArray();

                    result.LoadDataRow(array, true);

                }

            }

            return result;

        }

       

    
    }
}
